/*
 * Estado.java
 *
 * Classe representando um estado do autômato. A classe contem campos que informam
 * o nome do estado, se o mesmo é final ou não e as transições possíveis
 * no estado.
 *
 * Última modificação: 23/06/2010
 *
 * Autores:
 *    Felipe Lacet
 *    Gutenberg Neto
 *    Jader James
 *    Marcello Galdino
 *    Ronei Oliveira
 */

package lexico;

import java.util.ArrayList;

public class Estado {

    public boolean ehFinal;
    private String nome;
    private ArrayList<Transicao> transicoes;

    public Estado(String nome, ArrayList<Transicao> transicoes, boolean ehFinal) {
        this.nome = nome;
        this.ehFinal = ehFinal;

        if (transicoes != null) {
            this.transicoes = transicoes;
        } else {
            this.transicoes = new ArrayList<Transicao>();
        }
    }

    /*
     * Método que adiciona uma possível transição a esse estado
     * Entradas: transição a ser adicionada
     * Saída: nada
     */
    public void addTransicao(Transicao transicao){
        this.transicoes.add(transicao);
    }

    /*
     * Método que define o array de transições da instância como sendo o
     * recebido
     * Entradas: array a ser definido como array de transições da instância
     * Saída: nada
     */
    public void setTransicoes(ArrayList<Transicao> transicoes) {
        this.transicoes = transicoes;
    }

    /*
     * Método getter para o nome da classe
     * Entradas: nada
     * Saída: nome da classe
     */
    public String getNome() {
        return nome;
    }

    /*
     * Método que retorna o próximo estado do autômato a partir do símbolo recebido
     * Entradas: caractere que será utilizado na transição
     * Saída: próximo estado
     */
    public Estado getProximoEstado(char simbolo) {
        String aux = "";
        aux += simbolo;

        for (int i = 0; i < transicoes.size(); i++) {
            // verifica se o símbolo recebido faz parte de alguma das
            // transições presentes neste estado e, se estiver, retorna
            // o estado ao qual a transição leva
            if (transicoes.get(i).getSimbolosAceitos().indexOf(aux) != -1) {
                //System.out.println("Estado " + nome + " mudando para " + transicoes.get(i).estado.getNome());
                return transicoes.get(i).getEstado();
            }
        }

        // se o símbolo não estiver em nenhuma das transições, retorna nulo
        return null;
    }
}
